<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 函数嵌套
    /*  function fn() {
         var a = 10;
 
         function func() {
             a++;
             console.log(a); // 11
             return a;  // 11
         }
 
         return func(); // 11 
 
     }
     var result = fn();
     console.log(result);
 
     var result = fn();
     console.log(result); */

    // debugger;

    // 什么是闭包?
    // 闭包是指    有权访问另一个函数作用域中的变量    的函数。
    // 简单的来说  就是 一个函数在执行过程中 返回另一个函数/对象 (引用类型,一般都是函数),该函数引用了父作用域中的变量;

    // 如何形成闭包?
    // 1. 在函数内容部,返回一个引用类型(数组,对象,函数,以函数为主)
    // 2. 返回的引用类型(数组,对象,函数,以函数为主),使用函数中的局部作用域变量
    // 3. 在函数的外部,有变量来引用 引用类型

    function fn() {
        var a = 10; // 11

        return function func() { // 返回func
            a++;   // 11
            return a;
        }
    }
    var newFn = fn();  // newFn = func;  => 引用同一片内存空间
    console.log(newFn);

    var result = newFn();
    console.log(result);

    var result = newFn();
    console.log(result);

    var result = newFn();
    console.log(result);


    // 优点:  
    // 1. 减少全局变量的使用
    // 2. 可以在函数外部(闭包函数),访问函数内部的结果

    // 缺点:
    // 1. 被返回的函数一直被引用,父作用域也一直被引用得不到释放 => 如果闭包使用频率过高 =>栈内存,导致内存泄露
    // 2. 可以在函数外部(闭包函数),访问函数内部的结果 => 数据不安全



</script>

</html>